home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / docs / mb / src / mbmk.c < prev    next >
C/C++ Source or Header  |  2000-05-07  |  3KB  |  210 lines

  1. /*    モーションブラー?
  2. */
  3.  
  4. #include    <iocslib.h>
  5.  
  6.  
  7. enum    {
  8.     GS_NULL,
  9.     GS_EXIT,
  10.     GS_MAKE,
  11.     GS_PLAY
  12. };
  13. int    global_step;
  14.  
  15. #define        MAX_ANIM    (20)
  16. int        MAX_PICNUM;    //PICファイルの最終番号
  17.  
  18. unsigned short    g_buf[MAX_ANIM][256*256];    //元データ格納
  19. unsigned short    fr_buf[256*256];        //画面出力用
  20.  
  21. int    ANIMS=15;    //アニメの枚数
  22. int    now_frame;    //現在のフレーム番号0~(ANIMS-1)
  23.  
  24. int    vram_page=0;    //現在表示中のVRAM(仮想)ページ0,1
  25.  
  26. int    Sync()
  27. {
  28.     unsigned short    *v,*s;
  29.     int    np;
  30.     int    ssp;
  31.     short    x,y;
  32.     
  33. //    np=(vram_page==0)?1:0;
  34.     np=0;
  35.     v=(unsigned short *)(0xC00000+np*0x040000);
  36.     s=fr_buf;
  37.     ssp=B_SUPER(0);
  38.     for( y=0; y<256; y++ ){
  39.         for( x=0; x<256; x++ ){
  40.             *v++=*s++;
  41.         }
  42.         v+=256;
  43.     }
  44.     B_SUPER(ssp);
  45.  
  46.     HOME(0,0,np*256);
  47.     vram_page=np;
  48.     
  49.     return(0);
  50. }
  51.  
  52.  
  53.  
  54. int    Make()
  55. {
  56. #define    OV_FRAMES    (4)    //重ね会わせを行うフレーム数
  57.     unsigned short    level[OV_FRAMES];    //重ね会わせレベル
  58.     unsigned short    r[OV_FRAMES],g[OV_FRAMES],b[OV_FRAMES];
  59.     unsigned short    *s[OV_FRAMES],*d;
  60.     unsigned int    mr,mg,mb;
  61.     short    x,y,f;
  62.     unsigned char    loadname[256];
  63.     
  64.  
  65. printf("%02d\x0d",now_frame);
  66.  
  67.         //合計で4096に
  68. //        level[0]=2560;    level[1]= 768;    level[2]= 512;    level[3]= 256;    //@@4番目がほとんど反映されない
  69. //        level[0]=1536;    level[1]=1024;    level[2]= 896;    level[3]= 640;    //割と普通?
  70.         level[0]=2048;    level[1]=384;    level[2]= 640;    level[3]=1024;    //MATRIXっぽい?
  71. //        level[0]=1024; level[1]=1024; level[2]=1024; level[3]=1024;    //全平均
  72.  
  73.     
  74. MAX_PICNUM=20;
  75.     for( f=0; f<OV_FRAMES; f++ ){
  76.         sprintf(loadname,"M:TEST%03d.PIC",((now_frame-1-f+MAX_PICNUM)%MAX_PICNUM)+1 );
  77. printf(loadname);
  78.         Expand_DogaPic(loadname,g_buf[f]);
  79.         s[f]=g_buf[f];
  80.     }
  81. cls();
  82.     d=fr_buf;
  83.     
  84.     //もーしょんブラー本体
  85.     for( y=0; y<256; y++ ){ ; for( x=0; x<256; x++ ){
  86.         for( f=0; f<OV_FRAMES; f++ ){
  87.             r[f]=((*s[f]>>6)&0x1f);
  88.             g[f]=((*s[f]>>11)&0x1f);
  89.             b[f]=((*s[f]>>1)&0x1f);
  90.             s[f]++;
  91.         }
  92.         mr=0; mg=0; mb=0;
  93.         for( f=0; f<OV_FRAMES; f++ ){
  94.             mr+=(r[f]*level[f]);
  95.             mg+=(g[f]*level[f]);
  96.             mb+=(b[f]*level[f]);
  97.         }
  98.         mr>>=12;
  99.         mg>>=12;
  100.         mb>>=12;
  101.         *d++=((mr<<6)|(mg<<11)|(mb<<1));
  102.     }}
  103.     
  104.  
  105. #undef    OV_FRAMES
  106.  
  107. quick_exit:
  108.     return(0);
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115. int    Save()
  116. {
  117. //    unsigned char    savename[256];
  118.     unsigned char    comline[256];
  119.  
  120.  
  121.     sprintf(comline,"save OUT%03d.PIC",now_frame);
  122.     system(comline);
  123. }
  124.  
  125.  
  126.  
  127. #if 0
  128. int    Play()
  129. {
  130.     unsigned short    *s,*d;
  131.     short    x,y;
  132.     
  133.     s=o_buf[now_frame%MAX_ANIM];
  134.     d=fr_buf;
  135.     
  136. printf("%02d\x0d",now_frame);
  137.  
  138.     for( y=0; y<256; y++ ){
  139.         for( x=0; x<256; x++ ){
  140.             *d++=*s++;
  141.         }
  142.     }
  143.     now_frame++;
  144.     if( now_frame>MAX_ANIM ){
  145.         now_frame=0;
  146.     }
  147.  
  148. quick_exit:
  149.     return(0);
  150. }
  151. #endif
  152.  
  153.  
  154.  
  155. int    Idle()
  156. {
  157.     switch( global_step ){
  158.         case GS_MAKE:    Make();    break;
  159. //        case GS_PLAY:    Play();    break;
  160.     }
  161.  
  162.     if( BITSNS(0x00)==0x02 ){
  163.         global_step=GS_EXIT;
  164.         KFLUSHIO(0xff);
  165.     }
  166.  
  167.     return(0);
  168. }
  169.  
  170.  
  171.  
  172.  
  173. int    Init(argc,argv)
  174. int    argc;
  175. char    *argv[];
  176. {
  177.     global_step=GS_MAKE;
  178. //    screen(1,3,1,1);
  179.     screen(0,3,1,1);
  180.  
  181.     now_frame=1;
  182.     
  183.     return(0);
  184. }
  185.  
  186.  
  187.  
  188.  
  189. main(argc,argv)
  190. int    argc;
  191. char    *argv[];
  192. {
  193.     Init(argc,argv);
  194.     while( global_step!=GS_EXIT ){
  195.         Idle();
  196.         Sync();
  197.         Save();
  198.         now_frame++;
  199.         if( now_frame>MAX_ANIM ){
  200.             break;    //終わり
  201. //            now_frame=0;
  202. //            global_step=GS_PLAY;
  203.         }
  204.     }
  205. }
  206.  
  207.  
  208. /* [ EOF ] */
  209.  
  210.